package accueil.pack;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import chemin.pack.R;

import android.content.Context;
import android.graphics.*;
import android.os.Message;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import chemins.pack.Parcours;
import communication.IncomingHandler;

public class DrawViewApercuChemin extends View   {
		    


		
	
                    private static final String TAG = "DrawView";
		    Paint cheminPaint = new Paint();
		    Paint pointPaint = new Paint();
		    Paint distancesPaint = new Paint();
		    Paint flechePaint = new Paint();
		    Paint hauteurPaint = new Paint();
		    Paint portionPaint = new Paint();
		    Paint veloPaint = new Paint();
		    Paint whitePaint = new Paint();
		    
		    
                    Parcours parcours= new Parcours();
                    

		    
		    int distanceTotale = 1000;
                    int distanceFinale = 0;
                    int hauteurFinale = 0;
                    int hauteurInitiale = 0;
                    int penteMoyenne= 0;
                    float deniveleCumule = 0;
                    float distanceEnMonte = 0;
                    int decalageHauteur=0;
                    
		    float y_min;
		    float y_max ;
		    float x_max;
		    float x_min;

		    int penteMax = 20;
		    int penteMin = -20;

                    DecimalFormat df = new DecimalFormat ( ) ; 

		    

		    
		    
		
		    public DrawViewApercuChemin(Context context, AttributeSet attrs,int x_min,int x_max, int y_min, int y_max) {
		        super(context);
		        
                        
                        this.x_max = x_max;
                        this.x_min = x_min;
                        this.y_max = y_max;
                        this.y_min = y_min;
		        
		        
		        cheminPaint.setColor(Color.parseColor("#FFFF00"));
		        cheminPaint.setAntiAlias(true);
		        cheminPaint.setStrokeWidth(3);

                        df.setMinimumFractionDigits( 0 ) ;
                        df.setMaximumFractionDigits( 1 );
		        df.setDecimalSeparatorAlwaysShown( false ) ; 
		        
		        
		        setFocusable(true);
		        
		
		
		        
		
		    }
		
                    
                    public void miseEnFormeCheminTDF(){
                            
                            int i;
                            
                            Log.i("Drawing"," STARTmiseEnForme ");
                            Log.i("Drawing","Xmax= " + x_max);
                            distanceTotale = (int) parcours.getTab()[parcours.getSize()-1].getDistance();
                            decalageHauteur =(int) (parcours.getTab()[0].getHauteur());
                            
                            for (i=0;i<parcours.getSize();i++)
                            {
                                
                                if(parcours.getTab()[i].getHauteur() < decalageHauteur)
                                {
                                    decalageHauteur= (int) (parcours.getTab()[i].getHauteur());
                                }
                                
                            }
                            for (i=0;i<parcours.getSize();i++)
                            {
                                parcours.getTab()[i].setHauteur(parcours.getTab()[i].getHauteur()-decalageHauteur);
                                if(parcours.getTab()[i].getHauteur() > hauteurFinale)
                                {
                                    hauteurFinale = (int)(parcours.getTab()[i].getHauteur());
                                }
                                 
                            }
      
                            hauteurInitiale = (int) parcours.getTab()[0].getHauteur();
                            
                            
                            for(i=0;i<parcours.getSize();i++)
                            {
                                    parcours.getTab()[i].setX((float) (x_min+(x_max-x_min)/(distanceTotale)*parcours.getTab()[i].getDistance()));
                                    parcours.getTab()[i].setY( y_max -((float)(((parcours.getTab()[i].getHauteur()*(y_max-y_min))/(hauteurFinale)*((float) 1+ 1/10000000)))) );
                            }
                            Log.i("Drawing"," ENDmiseEnForme ");
                    }


//__________________________________________________________________________________________________________________________________________________________			    
		    
			@Override
		    public void onDraw(Canvas canvas) {

		        	int i=0;
		        	
		        	
		        	
		        	Log.i("Drawing"," start1 ");
                                Log.i("Drawing"," parcours size=" + parcours.getSize());
				    
        			while(i<=parcours.getSize()-1)
		        	{
                                        Log.i("Drawing"," i = " + i);
                                        
                                        
                                    
	        			if(parcours.getTab()[i].getY()>y_max)
	        			{
	        				parcours.getTab()[i].setY(y_max);
	        			}
			        	
		        		
                                        
		        		parcours.getTab()[i].setHauteur(  y_max -parcours.getTab()[i].getY() );
		        		
                                        
                                        parcours.getTab()[i].setHauteur((float)((parcours.getTab()[i].getHauteur())/(y_max-y_min)*(hauteurFinale)*((float) 1+ 1/10000000)));
                                        
                                        
                                        
                                        
                                       
		        		
		        		if(i!=0)
		        		{
                                                
		        			Log.i("Draw"," start3 ");
		        			
		        			parcours.getTab()[i].setDistance(( Math.sqrt(Math.pow((parcours.getTab()[i].getX()-parcours.getTab()[i-1].getX())/(x_max -x_min)*distanceTotale,2) +Math.pow(parcours.getTab()[i].getHauteur()-parcours.getTab()[i-1].getHauteur(), 2))));
		        			parcours.getTab()[i].setDistance( (parcours.getTab()[i].getDistance()) + parcours.getTab()[i-1].getDistance());
		        			
		        			parcours.getTab()[i].setPente((int)((parcours.getTab()[i-1].getHauteur()-parcours.getTab()[i].getHauteur())/(parcours.getTab()[i-1].getDistance()-parcours.getTab()[i].getDistance())*100));
		        			
		        			
		        			
		        			
		        			if((parcours.getTab()[i].getPente())>=0 && (parcours.getTab()[i].getPente())<=penteMax)
		        			{
		        				cheminPaint.setColor(Color.parseColor("#FF" +Integer.toHexString(255-(parcours.getTab()[i].getPente()*10)) +   "43"));
                                                        deniveleCumule =(deniveleCumule + parcours.getTab()[i].getHauteur()- parcours.getTab()[i-1].getHauteur());
                                                        distanceEnMonte =(float)(distanceEnMonte + parcours.getTab()[i].getDistance()- parcours.getTab()[i-1].getDistance());
		        			}
		        			
		        			
		        			if((parcours.getTab()[i].getPente())<0 && (parcours.getTab()[i].getPente())>=penteMin)
		        			{		        				
		        				cheminPaint.setColor(Color.parseColor("#"+Integer.toHexString( 255+(parcours.getTab()[i].getPente()*(-penteMin/2))) +   "ff00"));
		        			}

		        			
		        			canvas.drawLine(parcours.getTab()[i-1].getX(), parcours.getTab()[i-1].getY(), parcours.getTab()[i].getX(), parcours.getTab()[i].getY(), cheminPaint);

		        		
		        		}
                                        
                                        if(i == parcours.getSize()-1)
                                        {
                                           
                                            canvas.drawText("distance totale: "+ df.format(parcours.getTab()[i].getDistance()/1000) +" km" , x_min+(x_max-x_min)/3, y_max+10, distancesPaint);                                            
                                            penteMoyenne=(int)((deniveleCumule)/(distanceEnMonte)*100);		        			
                                            canvas.drawText("moyenne des pentes positives: "+ penteMoyenne +" %" , x_min+(x_max-x_min)/3, y_max+23, distancesPaint);
                                        }
		        		
		        		
		        		

					    i++;


		        	}
			
    }

}


	

	

